package com.bjpowernode.ba01;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.util.Date;

//切面类
/*
*   @Aspect：是aspectj框架中的一个注解
*   作用：表示当前类是一个切面类
*   切面类：是用于给业务方法实现功能增强的，这个类中含有切面的功能代码
*   位置：在类的定义上面
*
* */
@Aspect
@Component("aspect")
public class MyAspect {

  /*
  * 定义方法，方法是实现切面功能的
  * 方法定义的要求：
  * 1.访问权限修饰符是public
  * 2.没有返回值
  * 3.方法名称自定义
  * 4.方法可以有参数，也可以没有参数
  *     如果有参数，参数不是我们自定义的，有几个固定的参数类型可以使用
  * */

  /*
  * @Before:前置通知注解
  *     属性：value，值是切入点表达式，表示切面功能执行的位置
  *     位置:在方法上面
  * 特点：1.在目标方法前面执行
  *       2. 不会改变目标方法的执行结果
  *       3.不会影响目标方法的执行
  *
  *
  * */
 /* @Before(value = "execution(public void com.bjpowernode.ba01.SomeServiceImpl.doSome(String,Integer))")
    public void myBefore(){
        System.out.println("切面功能:输出时间。前置通知。这里我们要求在业务方法执行前输出时间"+new Date());
    }
}*/

   /* @Before(value = "execution( void com.bjpowernode.ba01.SomeServiceImpl.doSome(String,Integer))")
    public void myBefore(){
        System.out.println("切面功能:输出时间。前置通知。这里我们要求在业务方法执行前输出时间"+new Date());
    }*/


    /*
    * 指定方法中的参数:JoinPoint
    *   JoinPoint:代表业务方法，要加入切面功能的业务方法
    *   作用是:可以在通知方法中获取方法执行时的信息，例如方法名称，方法参数等。
    *   JoinPoint的值是由框架赋予，并且必须是第一个参数
    * */
    @Before(value = "execution( * *..SomeServiceImpl.do*(..))")
    public void myBefore2(JoinPoint jp){
        //获取方法的完整定义
        System.out.println("方法的签名(定义)"+jp.getSignature());
        System.out.println("方法的名称"+jp.getSignature().getName());
        //获取方法的实际参数
        Object object[]=jp.getArgs();
        for(Object s:object){
            System.out.println("实际参数"+s);
        }
        System.out.println("切面功能:输出时间。前置通知。这里我们要求在业务方法执行前输出时间"+new Date());
    }
}
